package org.biubiu0002.baiblog.core.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.biubiu0002.baiblog.common.utils.PageUtils;
import org.biubiu0002.baiblog.core.model.entity.SysUserEntity;
import org.biubiu0002.baiblog.core.model.vo.UserInfoVo;
import org.biubiu0002.baiblog.core.model.vo.req.UpdateUserStatusReqVo;
import org.biubiu0002.baiblog.core.model.vo.req.UserUpdateReqVo;
import org.biubiu0002.baiblog.core.model.vo.res.LoginResVo;

import java.util.List;
import java.util.Map;

/**
 * 用户表
 *
 * @author biubiu0002
 * @email 1007918011@qq.com
 * @date 2022-05-06 00:50:37
 */
public interface SysUserService extends IService<SysUserEntity> {

    /**
     * 分页查询
     * @param params 参数
     * @return 分页结果
     */
    PageUtils queryPage(Map<String, Object> params);

    /**
     * 根据用户uid获取用户,找不到返回null
     * @param userUid uid
     * @return 用户po
     */
    SysUserEntity getUserByUserUid(String userUid);

    /**
     * 根据用户uid列表获取用户
     * @param redisNotExistedUidList uidList
     * @return 用户polist
     */
    List<SysUserEntity> getUsersByUidList(List<String> redisNotExistedUidList);

    /**
     * 根据用户uid获取允许访问的资源 方法全限定名
     * @param userUid 用户uid
     * @return 方法全限定名
     */
    List<String> getAllPermissionByUserUid(String userUid);

    /**
     * 根据用户id查找用户信息，先从缓存取，取不到再读db
     * @param userUid uid
     * @return userInfo
     */
    UserInfoVo getUserInfoByUserUid(String userUid);

    /**
     * 获取uid 用户信息映射
     * 容量不能超过1000
     * 从redis获取用户信息，若不存在从db获取，并写回redis，过期时间为7天+(1~7)随机天
     * @param userUidList uid列表
     * @return 用户信息列表
     */
    Map<String,UserInfoVo> getUserInfoMap(List<String>userUidList);

    /**
     * 根据用户uid获取对应角色名
     * @param userUid 用户id
     * @return 角色名列表
     */
    List<String> getRoleNamesByUserUid(String userUid);

    /**
     * 根据用户uid获取对应角色id
     * @param userUid 用户id
     * @return 角色id list
     */
    List<Integer> getRolesByUserUid(String userUid);


    /**
     * 更新用户信息
     * @param userUpdateReqVo 信息vo
     */
    LoginResVo updateUser(UserUpdateReqVo userUpdateReqVo);

    /**
     * 管理员更新用户状态
     * @param updateUserStatusReqVo 更新用户状态
     */
    void updateUserStatus(UpdateUserStatusReqVo updateUserStatusReqVo);
}

